import 'package:flutter/material.dart';

//缩放路由动画
class ScaleRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  ScaleRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
    pageBuilder: (context, animation, secondaryAnimation) => child,
    transitionDuration: Duration(milliseconds: duration_ms),
    transitionsBuilder: (context, a1, a2, child) => ScaleTransition(
      scale: Tween(begin: 0.0, end: 1.0)
          .animate(CurvedAnimation(parent: a1, curve: curve)),
      child: child,
    ),
  );
}

//渐变透明路由动画
class FadeRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  FadeRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: duration_ms),
      transitionsBuilder: (context, a1, a2, child) => FadeTransition(
        opacity: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation(
          parent: a1,
          curve: curve,
        )),
        child: child,
      ));
}

//旋转路由动画
class RotateRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  RotateRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
      pageBuilder: (context, animation, secondaryAnimation) => child,
      transitionDuration: Duration(milliseconds: duration_ms),
      transitionsBuilder: (context, a1, a2, child) => RotationTransition(
        turns: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation(
          parent: a1,
          curve: curve,
        )),
        child: child,
      ));
}

//上--->下
class Top2BottomRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  Top2BottomRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
      transitionDuration: Duration(milliseconds: duration_ms),
      pageBuilder: (ctx, a1, a2) {
        return child;
      },
      transitionsBuilder: (
          ctx,
          a1,
          a2,
          Widget child,
          ) {
        return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(0.0, -1.0),
              end: Offset(0.0, 0.0),
            ).animate(CurvedAnimation(parent: a1, curve: curve)),
            child: child);
      });
}

//下--->上
class Bottom2TopRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  Bottom2TopRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
      transitionDuration: Duration(milliseconds: duration_ms),
      pageBuilder: (ctx, a1, a2) {
        return child;
      },
      transitionsBuilder: (
          ctx,
          a1,
          a2,
          Widget child,
          ) {
        return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(0.0, 1.0),
              end: Offset(0.0, 0.0),
            ).animate(CurvedAnimation(parent: a1, curve: curve)),
            child: child);
      });
}

//右--->左
class Right2LeftRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  Right2LeftRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
      transitionDuration: Duration(milliseconds: duration_ms),
      pageBuilder: (ctx, a1, a2) {
        return child;
      },
      transitionsBuilder: (
          ctx,
          a1,
          a2,
          Widget child,
          ) {
        return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(1.0, 0.0),
              end: Offset(0.0, 0.0),
            ).animate(CurvedAnimation(parent: a1, curve: curve)),
            child: child);
      });
}

//缩放+透明+旋转路由动画
class ScaleFadeRotateRouter<T> extends PageRouteBuilder<T> {
  final Widget child;
  final int duration_ms;
  final Curve curve;
  ScaleFadeRotateRouter(
      {required this.child, this.duration_ms = 500, this.curve = Curves.fastOutSlowIn})
      : super(
      transitionDuration: Duration(milliseconds: duration_ms),
      pageBuilder: (ctx, a1, a2) => child, //页面
      transitionsBuilder: (
          ctx,
          a1,
          a2,
          Widget child,
          ) {
        //构建动画
        return RotationTransition(
          //旋转动画
          turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
            parent: a1,
            curve: curve,
          )),
          child: ScaleTransition(
            //缩放动画
            scale: Tween(begin: 0.0, end: 1.0)
                .animate(CurvedAnimation(parent: a1, curve: curve)),
            child: FadeTransition(
              opacity: //透明度动画
              Tween(begin: 0.5, end: 1.0)
                  .animate(CurvedAnimation(parent: a1, curve: curve)),
              child: child,
            ),
          ),
        );
      });
}

//无动画
class NoAnimRouter<T> extends PageRouteBuilder<T> {
  final Widget page;
  NoAnimRouter(this.page)
      : super(
      opaque: false,
      pageBuilder: (context, animation, secondaryAnimation) => page,
      transitionDuration: Duration(milliseconds: 0),
      transitionsBuilder:
          (context, animation, secondaryAnimation, child) => child);
}
